package com.qf.index;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ZipUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;

import java.io.File;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 合并tb_true表，原来使用的张哥的C#写的程序，2023年12月15日因张哥的程序出现问题，重新用JAVA来写。注意！本程序是如果有同一个ut号的新的数据，会直接给予覆盖。
 * 贾新志 2023.12.16
 */

public class WosCsvUpData {
    public static void main(String[] args) throws SQLException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(format.format(new Date()) + " 程序开始了~~~");
        String limit = "";
//        String limit = " limit 1";
        int onePageNum = 1000;

        String utArticleTable = "scholar_25_02.spider_tb_true_92007022_1125";
        String recordTable = "scholar_25_02.wos_updata_record_table_0321";

        String path = "F:\\gcr\\wos20250226ge";
        Db.use().execute("truncate table " + recordTable);
        saveCsvSplitWos(path, recordTable, utArticleTable);

        System.out.println(format.format(new Date()) + " 程序结束了~~~");

    }

    public static void saveCsvSplitWos(String path, String recordTable, String utArticleTable) throws SQLException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<File> files = FileUtil.loopFiles(path);
        for (File file : files) {
            String filePath = file.getAbsolutePath();
            if (!filePath.toUpperCase().endsWith(".TXT") || !new File(filePath).exists()) {
                continue;
            }
            String str = FileUtil.readUtf8String(filePath);
            String[] line = str.split("\n");
            Set<String> utSet = new HashSet<>();
            for (int i = 0; i < line.length; i++) {
                String s = line[i];
                if (i == 0 && s.startsWith("\uFEFFnull")) {
                    System.out.println("错误的开头：" + s);
                }
                s = (i == 0 && s.startsWith("\uFEFFnullnullnullnullJ\t")) ? s.substring("\uFEFFnullnullnullnull".length()) : s;
                String[] split = s.split("\t");
                if (split.length != 71) {
                    System.out.println("--不相等，可能出现了错行或者WOS的格式改变，这是本条的源数据：" + s);
                    continue;
                }
                boolean bool = true;
                if (i == 0 && s.startsWith("\uFEFFPT\tAU")) {
                    if ("PT".equals(split[0].trim()) && "AU".equals(split[1]) && "BA".equals(split[2]) && "BE".equals(split[3]) && "GP".equals(split[4]) && "AF".equals(split[5]) && "BF".equals(split[6]) && "CA".equals(split[7]) && "TI".equals(split[8]) &&
                            "SO".equals(split[9]) && "SE".equals(split[10]) && "BS".equals(split[11]) && "LA".equals(split[12]) && "DT".equals(split[13]) && "CT".equals(split[14]) && "CY".equals(split[15]) && "CL".equals(split[16]) && "SP".equals(split[17]) &&
                            "HO".equals(split[18]) && "DE".equals(split[19]) && "ID".equals(split[20]) && "AB".equals(split[21]) && "C1".equals(split[22]) && "C3".equals(split[23]) && "RP".equals(split[24]) && "EM".equals(split[25]) && "RI".equals(split[26]) &&
                            "OI".equals(split[27]) && "FU".equals(split[28]) && "FP".equals(split[29]) && "FX".equals(split[30]) && "CR".equals(split[31]) && "NR".equals(split[32]) && "TC".equals(split[33]) && "Z9".equals(split[34]) && "U1".equals(split[35]) &&
                            "U2".equals(split[36]) && "PU".equals(split[37]) && "PI".equals(split[38]) && "PA".equals(split[39]) && "SN".equals(split[40]) && "EI".equals(split[41]) && "BN".equals(split[42]) && "J9".equals(split[43]) && "JI".equals(split[44]) &&
                            "PD".equals(split[45]) && "PY".equals(split[46]) && "VL".equals(split[47]) && "IS".equals(split[48]) && "PN".equals(split[49]) && "SU".equals(split[50]) && "SI".equals(split[51]) && "MA".equals(split[52]) && "BP".equals(split[53]) &&
                            "EP".equals(split[54]) && "AR".equals(split[55]) && "DI".equals(split[56]) && "DL".equals(split[57]) && "D2".equals(split[58]) && "EA".equals(split[59]) && "PG".equals(split[60]) && "WC".equals(split[61]) && "WE".equals(split[62]) &&
                            "SC".equals(split[63]) && "GA".equals(split[64]) && "PM".equals(split[65]) && "OA".equals(split[66]) && "HC".equals(split[67]) && "HP".equals(split[68]) && "DA".equals(split[69]) && "UT".equals(split[70].trim())) {
                        continue;
                    } else {
                        System.out.println("--不相等，可能出现了错行或者WOS的格式改变，这是本条的源数据：" + s);
                        bool = false;
                    }
                }
                String ut = split[70].toUpperCase().trim().replace("：", ":").replaceAll("[^A-Za-z0-9:]", "");
                if (bool && ut.startsWith("WOS:") && ut.length() == 19) {
                    List<Entity> tableData = Db.use().query("select `pid`,`UT` from " + utArticleTable + " where `UT` = \"" + ut + "\";");
                    if (tableData.isEmpty()) {
                        try {
                            Db.use().insert(Entity.create(utArticleTable).set("PT", split[0].trim()).set("AU", split[1]).set("BA", split[2]).set("BE", split[3]).set("GP", split[4]).set("AF", split[5]).set("BF", split[6]).set("CA", split[7]).set("TI", split[8])
                                    .set("SO", split[9]).set("SE", split[10]).set("BS", split[11]).set("LA", split[12]).set("DT", split[13]).set("CT", split[14]).set("CY", split[15]).set("CL", split[16]).set("SP", split[17]).set("HO", split[18])
                                    .set("DE", split[19]).set("ID", split[20]).set("AB", split[21]).set("C1", split[22]).set("C3", split[23]).set("RP", split[24]).set("EM", split[25]).set("RI", split[26]).set("OI", split[27]).set("FU", split[28])
                                    .set("FP", split[29]).set("FX", split[30]).set("CR", split[31]).set("NR", split[32]).set("TC", split[33]).set("Z9", split[34]).set("U1", split[35]).set("U2", split[36]).set("PU", split[37]).set("PI", split[38])
                                    .set("PA", split[39]).set("SN", split[40]).set("EI", split[41]).set("BN", split[42]).set("J9", split[43]).set("JI", split[44]).set("PD", split[45]).set("PY", split[46]).set("VL", split[47]).set("IS", split[48])
                                    .set("PN", split[49]).set("SU", split[50]).set("SI", split[51]).set("MA", split[52]).set("BP", split[53]).set("EP", split[54]).set("AR", split[55]).set("DI", split[56]).set("DL", split[57]).set("D2", split[58])
                                    .set("EA", split[59]).set("PG", split[60]).set("WC", split[61]).set("WE", split[62]).set("SC", split[63]).set("GA", split[64]).set("PM", split[65]).set("OA", split[66]).set("HC", split[67]).set("HP", split[68])
                                    .set("DA", split[69]).set("UT", split[70].trim()));
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    } else {
                        for (Entity entry : tableData) {
                            Integer pid = entry.getInt("pid");
                            String tableUt = entry.getStr("UT");
                            if (null != pid && null != tableUt && pid > 0 && tableUt.equals(ut)) {
                                try {
                                    Db.use().update(
                                            Entity.create().set("PT", split[0].trim()).set("AU", split[1]).set("BA", split[2]).set("BE", split[3]).set("GP", split[4]).set("AF", split[5]).set("BF", split[6]).set("CA", split[7]).set("TI", split[8])
                                                    .set("SO", split[9]).set("SE", split[10]).set("BS", split[11]).set("LA", split[12]).set("DT", split[13]).set("CT", split[14]).set("CY", split[15]).set("CL", split[16]).set("SP", split[17]).set("HO", split[18])
                                                    .set("DE", split[19]).set("ID", split[20]).set("AB", split[21]).set("C1", split[22]).set("C3", split[23]).set("RP", split[24]).set("EM", split[25]).set("RI", split[26]).set("OI", split[27]).set("FU", split[28])
                                                    .set("FP", split[29]).set("FX", split[30]).set("CR", split[31]).set("NR", split[32]).set("TC", split[33]).set("Z9", split[34]).set("U1", split[35]).set("U2", split[36]).set("PU", split[37]).set("PI", split[38])
                                                    .set("PA", split[39]).set("SN", split[40]).set("EI", split[41]).set("BN", split[42]).set("J9", split[43]).set("JI", split[44]).set("PD", split[45]).set("PY", split[46]).set("VL", split[47]).set("IS", split[48])
                                                    .set("PN", split[49]).set("SU", split[50]).set("SI", split[51]).set("MA", split[52]).set("BP", split[53]).set("EP", split[54]).set("AR", split[55]).set("DI", split[56]).set("DL", split[57]).set("D2", split[58])
                                                    .set("EA", split[59]).set("PG", split[60]).set("WC", split[61]).set("WE", split[62]).set("SC", split[63]).set("GA", split[64]).set("PM", split[65]).set("OA", split[66]).set("HC", split[67]).set("HP", split[68])
                                                    .set("DA", split[69]).set("UT", split[70].trim()), Entity.create(utArticleTable).set("pid", pid));
                                } catch (SQLException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                    utSet.add(ut);
                }
            }
            try {
                Db.use().insert(Entity.create(recordTable).set("path", filePath).set("sum", utSet.size()).set("date", LocalDateTime.now()));
                System.out.println("\033[31;1m" + format.format(new Date()) + " 成功插入： " + utSet.size() + " 条。文件：" + filePath + Utils.printMemoryStr() + "\033[0m");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


}
